/**
 * 集合工具类型：
 * 这一部分的工具类型主要使用 条件类型、条件类型分布式 特性。
 * 
 * 对于两个集合来说，通常存在
 * 交集 Exclude：两个集合的合并
 * 并集 Concurrence：两个集合的相交部分
 * 差集 Extract：对于 A、B 两个集合来说，A 相对于 B 的差集即为 A 中独有而 B 中不存在的元素 的组成的集合
 * 补集 Complement：补集是差集的特殊情况，此时集合 B 为集合 A 的子集，在这种情况下 A 相对于 B 的差集 + B = 完整的集合 A。
*/

/**
 * 内置工具类型中提供了交集与差集的实现：
 * 交集 Exclude (排除/不包括)：返回 Exclude<A, B> 的结果就是联合类型 A 中不存在于 B 中的部分
 * 差集 Extract (提取/包括)：返回 Exclude<A, B> 的结果就是联合类型 A 中存在于 B 中的部分
*/
//交集 Exclude
type Tmp1 = Exclude<1, 2>; // 1
type Tmp2 = Exclude<1 | 2, 2>; // 1
type Tmp3 = Exclude<1 | 2 | 3, 2 | 3>; // 1
type Tmp4 = Exclude<1 | 2 | 3, 2 | 4>; // 1 | 3
//差集 Extract
type Tmp5 = Extract<1 | 2, 2>; 
type Tmp6 = Extract<1 | 2 | 3, 2 | 4>;
type Tmp7 = Extract<1 | 2 | 3, 2 | 3>;

//并集 Concurrence 的实现：
type Concurrence<A, B> = A | B;
type Tmp8 = Concurrence<1 | 2 | 3, 2 | 3 | 8>;

//补集 Complement 的实现，需要约束集合 B 为集合 A 的子集：
type Complement<A, B extends A> = Extract<A, B>;
type Tmp9 = Complement<1 | 2 | 3, 1 | 2>;

//内置工具类型中还有一个场景比较明确的集合工具类型
//NonNullable，是集合 T 相对于 null | undefined 的差集：
type Tmp10 = NonNullable<1|null|2>; // 1 ｜ 2
type myType = string | number | null | undefined
type noNulls = NonNullable<myType> // string | number


//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }